#打包成Docker镜像的脚本
#!/bin/bash

#操作项目路径(Dockerfile存放的路径)
BASE_PATH=/root/Test-Jenkins

# jenkins生成源jar路径  
SOURCE_PATH=/root/.jenkins/workspace  

#docker 镜像/容器名字(只能全小写不能包含大写或者特殊字符)
SERVER_NAME=testjenkins

#指定映射端口
port=8093 

#dockerfile的名称
DOCKER_FILENAME=Dockerfile

#jar包的名称
JAR_NAME=Test-Jenkins-s-1.0-SNAPSHOT

#项目名称
PROJECT_NAME=Test-Jenkins

#docker容器内的映射目录（这里映射主机的目录挂载到容器）
CONTAINER_FILE=/opt/jenkins/


#当前时间
DATE=`date +%Y%m%d%H%M`
 
 
# 将jenkins最新的构建jar包 移动到项目目录下
function transfer(){
    echo "最新构建代码 $SOURCE_PATH/$PROJECT_NAME/target/$JAR_NAME.jar 迁移至 $BASE_PATH ...."
        cp -f $SOURCE_PATH/$PROJECT_NAME/target/$JAR_NAME.jar $BASE_PATH 
		#复制jar过去可能会没有权限。因此最好赋予足够权限
		chmod -R 777 $BASE_PATH/$JAR_NAME.jar
    echo "迁移完成"
}
 
# 将历史版本jar包进行备份
function backup(){
	#如果备份目录不存在则创建
	if [ ! -d "$BASE_PATH/backup" ]; then
			mkdir $BASE_PATH/backup
			echo "创建备份目录：$BASE_PATH/backup"
	fi
		
	if [ -f "$BASE_PATH/$JAR_NAME.jar" ]; then
    	echo "$JAR_NAME.jar 备份..."
        	cp $BASE_PATH/$JAR_NAME.jar  $BASE_PATH/backup/$JAR_NAME-$DATE.jar
        echo "备份 $BASE_PATH/backup/$JAR_NAME-$DATE.jar 完成"
    else
    	echo "$BASE_PATH/$JAR_NAME.jar不存在，跳过备份"
    fi
}
 
# 构建docker镜像；
# 如果已经存在则重启即可（
# 因为进行宿主机和容器目录映射所以只需要把最新的jar移动到映射目录下重启容器就可以了）
# （不需要每次多删除容器，删除镜像在重新再构建）
function build(){
	#容器id
	CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
	#镜像id
	IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
	#如果镜像已存在则不用重新构建；不存在则构建
	if [ -n "$IID" ]; then
		echo "存在SERVER_NAME镜像，IID=$IID"
	else
		echo "不存在SERVER_NAME镜像，开始构建镜像"
			cd $BASE_PATH
		#开始构建docker镜像 -t 指定镜像名字； 看需要可以加上-f 指定Dockerfile的路径；如果不加默认用当前目录下的Dockerfile
		   docker build -f $BASE_PATH/$DOCKER_FILENAME  -t $SERVER_NAME .
	fi
	
	#如果容器已启动则重启；未启动则启动
	if [ -n "$CID" ]; then
		echo "存在$ERVER_NAME容器，CID=$CID,重启docker容器 ..."
			docker restart $SERVER_NAME 
		echo "$ERVER_NAME容器重启完成"
	else
		echo "不存在$SERVER_NAME容器，docker run创建容器..."
			#启动docker容器 --name指定容器名称 -idt容器后台运行并；-v 将主机的目录挂载到容器上的目录
			#这里映射主机的目录挂载到容器上，之后换包就不用重新构建docker镜像，重启容器就行了
		    docker run --name  $SERVER_NAME -v $BASE_PATH:$CONTAINER_FILE -p $port:$port -idt $SERVER_NAME 
		echo "$ERVER_NAME容器创建完成"
	fi

}
 
# 主方法入口
function run(){
	backup
	transfer
	build
}
#调用入口方法
run 